package com.cn.exercise;

import java.lang.reflect.Field;

public class AnnotationProcessor {
    public static void processAnnotations(Object obj){
        Class<?> clazz = obj.getClass();
        Field[] fields = clazz.getDeclaredFields();

        for (Field field : fields) {
            if(field.isAnnotationPresent(AutoPrintHello.class)){
                //`field.setAccessible(true);` 的作用是通过反射机制强制设置字段的可访问性，即使字段是 `private` 或 `protected`，也可以通过反射访问和修改它的值。
                //
                //在 Java 中，默认情况下，反射无法直接访问非 `public` 的字段或方法。通过调用 `setAccessible(true)`，可以绕过 Java 的访问控制检查，从而允许对字段进行操作。
                //
                //需要注意的是，这种操作可能会破坏封装性，应该谨慎使用。
                field.setAccessible(true);
                //获取字段上的注解
                AutoPrintHello annotation = field.getAnnotation(AutoPrintHello.class);
                //获取注解的numbers属性
                if(field.getType() == int.class){
                    //获取注解的number属性
                    int numberValue = annotation.number();
                    try {
                        field.set(obj,numberValue);
                    } catch (IllegalAccessException e) {
                        throw new RuntimeException(e);
                    }
                }
                if(field.getType()==String.class){
                    String value = annotation.value();
                    try{
                        field.set(obj,value);
                    }catch (IllegalAccessException e){
                        throw new RuntimeException(e);
                    }
                }

                }
            }
    }

    public static void main(String[] args) {
        TestClass testClass = new TestClass();
        System.out.println("Before:"+testClass);
        AnnotationProcessor.processAnnotations(testClass);
        System.out.println("after:"+testClass);
    }

}
